package org.sam.beatles.ui;

import java.awt.BorderLayout;
import java.util.Collection;

import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

import org.sam.swing.JSPanel;
import org.sam.swing.JSToolBar;
import org.sam.swing.table.JSTable;
import org.sam.swing.table.JSTableColumnModel;
import org.sam.swing.table.JSTableModel;
import org.sam.swing.table.tools.JSTableToolBar;

/**
 * 这里是一个窗口的
 * 
 * @author sam
 *
 */
public abstract class JPanelSingleDataWindow<T> extends JSPanel implements UIBuilder {

	private static final long serialVersionUID = 4515802961101063776L;

	/**
	 * 当前的窗口
	 */
	protected JSTable table;

	/**
	 * 窗口model
	 */
	protected JSTableModel<Collection<T>> tableModel;

	/**
	 * 窗口colmodel
	 */
	protected JSTableColumnModel tableColModel;
	
	/**
	 * 工具条
	 */
	protected JSToolBar toolBar;
	
	/**
	 * 底部工具
	 */
	protected JSToolBar footerBar;

	/**
	 * 生成窗口
	 * 
	 * @return
	 */
	protected abstract JSTable buildTable();

	/**
	 * 生成窗口操作工具
	 * 
	 * @return
	 */
	protected JSToolBar buildToolBar() {
		JSTableToolBar toolBar = new JSTableToolBar(table);
		toolBar.enableRetrieve();
		toolBar.enableEdit();
		toolBar.enableAdd();
		toolBar.enableDel();
		toolBar.enableSave();
		return toolBar;
	}
	
	/**
	 * 生成搜索条
	 * @param toolBar
	 */
	protected void buildSearch(JSToolBar toolBar) {
		if (toolBar == null)
			return;
		
		if (toolBar instanceof JSTableToolBar) {
			((JSTableToolBar)toolBar).enableSearch();
		}
	}
	
	/**
	 * 异步加载数据的操作
	 */
	protected void asyncAfterBuilder() {
		if (this.tableModel != null) {
			try {
				this.tableModel.retrieve();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 生成底部工具栏
	 * 
	 * @return
	 */
	protected JSToolBar buildFoorterBar() {
		return null;
	}

	/**
	 * 初始化窗口
	 */
	@Override
	public void buildCompents() {
		this.setLayout(new BorderLayout());

		this.table = this.buildTable();
		if (this.table != null) {
			table.setName("table");
			this.add(new JScrollPane(this.table), BorderLayout.CENTER);
		}
		
		this.toolBar = this.buildToolBar();
		if (toolBar != null) {
			toolBar.setName("toolBar");
			this.buildSearch(toolBar);
			this.add(toolBar, BorderLayout.NORTH);
		}

		this.footerBar = this.buildFoorterBar();
		if (footerBar != null) {
			footerBar.setName("footerBar");
			this.add(footerBar, BorderLayout.SOUTH);
		}
		
		SwingUtilities.invokeLater(() -> {
			asyncAfterBuilder();
		});
	}
}
